/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package logicanegocio;

import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entities.Silla;
import entities.Partido;
import entities.Entrada;
import entities.Sillaxpartido;
import entities.SillaxpartidoPK;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import logicanegocio.exceptions.IllegalOrphanException;
import logicanegocio.exceptions.NonexistentEntityException;
import logicanegocio.exceptions.PreexistingEntityException;

/**
 *
 * @author Alejandro
 */
public class SillaxpartidoJpaController implements Serializable {

    public SillaxpartidoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Sillaxpartido sillaxpartido) throws PreexistingEntityException, Exception {
        if (sillaxpartido.getSillaxpartidoPK() == null) {
            sillaxpartido.setSillaxpartidoPK(new SillaxpartidoPK());
        }
        if (sillaxpartido.getEntradaList() == null) {
            sillaxpartido.setEntradaList(new ArrayList<Entrada>());
        }
        sillaxpartido.getSillaxpartidoPK().setSillaCatIdCategoria(sillaxpartido.getSilla().getSillaPK().getCategoriaIdCategoria());
        sillaxpartido.getSillaxpartidoPK().setSillaNumeroFila(sillaxpartido.getSilla().getSillaPK().getNumeroFila());
        sillaxpartido.getSillaxpartidoPK().setSillaNumeroAsiento(sillaxpartido.getSilla().getSillaPK().getNumeroAsiento());
        sillaxpartido.getSillaxpartidoPK().setPartidoIdPartido(sillaxpartido.getPartido().getIdPartido().toBigInteger());
        sillaxpartido.getSillaxpartidoPK().setSillaCatEstIdEst(sillaxpartido.getSilla().getSillaPK().getCategoriaEstadioIdEstadio());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Silla silla = sillaxpartido.getSilla();
            if (silla != null) {
                silla = em.getReference(silla.getClass(), silla.getSillaPK());
                sillaxpartido.setSilla(silla);
            }
            Partido partido = sillaxpartido.getPartido();
            if (partido != null) {
                partido = em.getReference(partido.getClass(), partido.getIdPartido());
                sillaxpartido.setPartido(partido);
            }
            List<Entrada> attachedEntradaList = new ArrayList<Entrada>();
            for (Entrada entradaListEntradaToAttach : sillaxpartido.getEntradaList()) {
                entradaListEntradaToAttach = em.getReference(entradaListEntradaToAttach.getClass(), entradaListEntradaToAttach.getIdEntrada());
                attachedEntradaList.add(entradaListEntradaToAttach);
            }
            sillaxpartido.setEntradaList(attachedEntradaList);
            em.persist(sillaxpartido);
            if (silla != null) {
                silla.getSillaxpartidoList().add(sillaxpartido);
                silla = em.merge(silla);
            }
            if (partido != null) {
                partido.getSillaxpartidoList().add(sillaxpartido);
                partido = em.merge(partido);
            }
            for (Entrada entradaListEntrada : sillaxpartido.getEntradaList()) {
                Sillaxpartido oldSillaxpartidoOfEntradaListEntrada = entradaListEntrada.getSillaxpartido();
                entradaListEntrada.setSillaxpartido(sillaxpartido);
                entradaListEntrada = em.merge(entradaListEntrada);
                if (oldSillaxpartidoOfEntradaListEntrada != null) {
                    oldSillaxpartidoOfEntradaListEntrada.getEntradaList().remove(entradaListEntrada);
                    oldSillaxpartidoOfEntradaListEntrada = em.merge(oldSillaxpartidoOfEntradaListEntrada);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findSillaxpartido(sillaxpartido.getSillaxpartidoPK()) != null) {
                throw new PreexistingEntityException("Sillaxpartido " + sillaxpartido + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Sillaxpartido sillaxpartido) throws IllegalOrphanException, NonexistentEntityException, Exception {
        sillaxpartido.getSillaxpartidoPK().setSillaCatIdCategoria(sillaxpartido.getSilla().getSillaPK().getCategoriaIdCategoria());
        sillaxpartido.getSillaxpartidoPK().setSillaNumeroFila(sillaxpartido.getSilla().getSillaPK().getNumeroFila());
        sillaxpartido.getSillaxpartidoPK().setSillaNumeroAsiento(sillaxpartido.getSilla().getSillaPK().getNumeroAsiento());
        sillaxpartido.getSillaxpartidoPK().setPartidoIdPartido(sillaxpartido.getPartido().getIdPartido().toBigInteger());
        sillaxpartido.getSillaxpartidoPK().setSillaCatEstIdEst(sillaxpartido.getSilla().getSillaPK().getCategoriaEstadioIdEstadio());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Sillaxpartido persistentSillaxpartido = em.find(Sillaxpartido.class, sillaxpartido.getSillaxpartidoPK());
            Silla sillaOld = persistentSillaxpartido.getSilla();
            Silla sillaNew = sillaxpartido.getSilla();
            Partido partidoOld = persistentSillaxpartido.getPartido();
            Partido partidoNew = sillaxpartido.getPartido();
            List<Entrada> entradaListOld = persistentSillaxpartido.getEntradaList();
            List<Entrada> entradaListNew = sillaxpartido.getEntradaList();
            List<String> illegalOrphanMessages = null;
            for (Entrada entradaListOldEntrada : entradaListOld) {
                if (!entradaListNew.contains(entradaListOldEntrada)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Entrada " + entradaListOldEntrada + " since its sillaxpartido field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (sillaNew != null) {
                sillaNew = em.getReference(sillaNew.getClass(), sillaNew.getSillaPK());
                sillaxpartido.setSilla(sillaNew);
            }
            if (partidoNew != null) {
                partidoNew = em.getReference(partidoNew.getClass(), partidoNew.getIdPartido());
                sillaxpartido.setPartido(partidoNew);
            }
            List<Entrada> attachedEntradaListNew = new ArrayList<Entrada>();
            for (Entrada entradaListNewEntradaToAttach : entradaListNew) {
                entradaListNewEntradaToAttach = em.getReference(entradaListNewEntradaToAttach.getClass(), entradaListNewEntradaToAttach.getIdEntrada());
                attachedEntradaListNew.add(entradaListNewEntradaToAttach);
            }
            entradaListNew = attachedEntradaListNew;
            sillaxpartido.setEntradaList(entradaListNew);
            sillaxpartido = em.merge(sillaxpartido);
            if (sillaOld != null && !sillaOld.equals(sillaNew)) {
                sillaOld.getSillaxpartidoList().remove(sillaxpartido);
                sillaOld = em.merge(sillaOld);
            }
            if (sillaNew != null && !sillaNew.equals(sillaOld)) {
                sillaNew.getSillaxpartidoList().add(sillaxpartido);
                sillaNew = em.merge(sillaNew);
            }
            if (partidoOld != null && !partidoOld.equals(partidoNew)) {
                partidoOld.getSillaxpartidoList().remove(sillaxpartido);
                partidoOld = em.merge(partidoOld);
            }
            if (partidoNew != null && !partidoNew.equals(partidoOld)) {
                partidoNew.getSillaxpartidoList().add(sillaxpartido);
                partidoNew = em.merge(partidoNew);
            }
            for (Entrada entradaListNewEntrada : entradaListNew) {
                if (!entradaListOld.contains(entradaListNewEntrada)) {
                    Sillaxpartido oldSillaxpartidoOfEntradaListNewEntrada = entradaListNewEntrada.getSillaxpartido();
                    entradaListNewEntrada.setSillaxpartido(sillaxpartido);
                    entradaListNewEntrada = em.merge(entradaListNewEntrada);
                    if (oldSillaxpartidoOfEntradaListNewEntrada != null && !oldSillaxpartidoOfEntradaListNewEntrada.equals(sillaxpartido)) {
                        oldSillaxpartidoOfEntradaListNewEntrada.getEntradaList().remove(entradaListNewEntrada);
                        oldSillaxpartidoOfEntradaListNewEntrada = em.merge(oldSillaxpartidoOfEntradaListNewEntrada);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                SillaxpartidoPK id = sillaxpartido.getSillaxpartidoPK();
                if (findSillaxpartido(id) == null) {
                    throw new NonexistentEntityException("The sillaxpartido with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(SillaxpartidoPK id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Sillaxpartido sillaxpartido;
            try {
                sillaxpartido = em.getReference(Sillaxpartido.class, id);
                sillaxpartido.getSillaxpartidoPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The sillaxpartido with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Entrada> entradaListOrphanCheck = sillaxpartido.getEntradaList();
            for (Entrada entradaListOrphanCheckEntrada : entradaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Sillaxpartido (" + sillaxpartido + ") cannot be destroyed since the Entrada " + entradaListOrphanCheckEntrada + " in its entradaList field has a non-nullable sillaxpartido field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Silla silla = sillaxpartido.getSilla();
            if (silla != null) {
                silla.getSillaxpartidoList().remove(sillaxpartido);
                silla = em.merge(silla);
            }
            Partido partido = sillaxpartido.getPartido();
            if (partido != null) {
                partido.getSillaxpartidoList().remove(sillaxpartido);
                partido = em.merge(partido);
            }
            em.remove(sillaxpartido);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Sillaxpartido> findSillaxpartidoEntities() {
        return findSillaxpartidoEntities(true, -1, -1);
    }

    public List<Sillaxpartido> findSillaxpartidoEntities(int maxResults, int firstResult) {
        return findSillaxpartidoEntities(false, maxResults, firstResult);
    }

    private List<Sillaxpartido> findSillaxpartidoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Sillaxpartido.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Sillaxpartido findSillaxpartido(SillaxpartidoPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Sillaxpartido.class, id);
        } finally {
            em.close();
        }
    }

    public int getSillaxpartidoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Sillaxpartido> rt = cq.from(Sillaxpartido.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
